package main

import (
	"fmt"
	"time"

	"github.com/go-redis/redis"
)

var redisdb *redis.Client

func init() {
	redisdb = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})

	pong, err := redisdb.Ping().Result()
	fmt.Println(pong, err)

}
func main() {

	// key key
	// ExampleKey()

	// hash 散列
	// ExampleHash()

	// list  有序
	// ExampleList()

	//set   无序不重复
	//key-stringX, stringY…，
	// ExampleSet()

	// sort set  有序集合 不重复
	// key-score1:stringX, score2:stringY
	ExampleSortSet()
}

func ExampleSortSet() {

	redisdb.FlushDb()
	// 添加
	fmt.Println(redisdb.ZAdd("Zkey1", []redis.Z{
		redis.Z{
			Score:  1,
			Member: 10,
		},
		redis.Z{
			Score:  2,
			Member: 20,
		},
	}...).Val())
	// 发生变化
	fmt.Println(redisdb.ZAddCh("Zkey1", []redis.Z{
		redis.Z{
			Score:  3,
			Member: 30,
		},
		redis.Z{
			Score:  4,
			Member: 40,
		},
	}...).Val())
	// 成员不存在才添加
	fmt.Println(redisdb.ZAddNX("Zkey1", []redis.Z{
		redis.Z{
			Score:  5,
			Member: 50,
		},
		redis.Z{
			Score:  5,
			Member: 55,
		},
		redis.Z{
			Score:  5,
			Member: 50,
		},
	}...).Val())
	// 全部成员
	fmt.Println(redisdb.ZCard("Zkey1").Val())
	fmt.Println(redisdb.ZCount("Zkey1", "1", "5").Val())
	fmt.Println(redisdb.ZIncr("Zkey1", redis.Z{
		Score:  5,
		Member: 51,
	}).Val())

	fmt.Println(redisdb.ZRange("Zkey1", 0, -1).Val())

}

func ExampleSet() {
	redisdb.FlushDb()
	// 添加
	fmt.Println(redisdb.SAdd("skey1", 1, 2, 3, 4, 4).Val())
	// 成员数量
	fmt.Println(redisdb.SCard("skey1").Val())
	// 全部成员
	fmt.Println(redisdb.SMembers("skey1").Val())
	fmt.Println(redisdb.SMembersMap("skey1").Val())
	// 是否存在成员

	fmt.Println(redisdb.SIsMember("skey1", 1).Val())

	// 移动成员
	fmt.Println(redisdb.SMove("skey1", "skey2", 2).Val())
	// 弹出成员
	fmt.Println(redisdb.SPop("skey1").Val())
	fmt.Println(redisdb.SMembers("skey1").Val())

	fmt.Println(redisdb.SMembers("skey2").Val())

	fmt.Println(redisdb.SAdd("skey3", 1, 2, 3, 4, 5).Val())
	fmt.Println(redisdb.SAdd("skey4", 2, 3, 4, 5, 6).Val())
	fmt.Println(redisdb.SUnionStore("skey5", "skey3", "skey4").Val())

	fmt.Println(redisdb.SMembers("skey5").Val())

	fmt.Println(redisdb.SDiffStore("skey6", "skey3", "skey4").Val())

	fmt.Println(redisdb.SMembers("skey6").Val())

	fmt.Println(redisdb.SInterStore("skey7", "skey3", "skey4").Val())

	fmt.Println(redisdb.SMembers("skey7").Val())
	// fmt.Println(redisdb.SIsMember("skey1", 1).Val())
	// fmt.Println(redisdb.SIsMember("skey1", 1).Val())
	// fmt.Println(redisdb.SIsMember("skey1", 1).Val())
	// fmt.Println(redisdb.SIsMember("skey1", 1).Val())

}

func ExampleList() {
	redisdb.FlushDb()
	fmt.Println(redisdb.LPush("hk1", 1, 2, 3, 4).Val())
	fmt.Println(redisdb.LRange("hk1", 0, -1).Val())
	// 当key 存在才干这个push
	fmt.Println(redisdb.LPush("hk1", 1, 2, 3, 4, 5).Val())
	fmt.Println(redisdb.LRange("hk1", 0, -1).Val())
	// 删除几个  指定的value
	fmt.Println(redisdb.LRem("hk1", 1, 2).Val())
	fmt.Println(redisdb.LRange("hk1", 0, -1).Val())
	// 修剪
	fmt.Println(redisdb.LTrim("hk1", 0, -2).Val())
	fmt.Println(redisdb.LRange("hk1", 0, -1).Val())
	fmt.Println(redisdb.LInsertBefore("hk1", 3, 1100).Val())
	fmt.Println(redisdb.LRange("hk1", 0, -1).Val())
	fmt.Println(redisdb.LIndex("hk1", 3).Val())
}
func ExampleHash() {
	// key - field- value
	fmt.Println(redisdb.HSet("hk1", "f1", "v1").Val())
	fmt.Println(redisdb.HGet("hk1", "f1").Val())
	fmt.Println(redisdb.HDel("hk1", "f1").Val())
	fmt.Println(redisdb.HKeys("hk1").Val())
	fmt.Println(redisdb.HVals("hk1").Val())
	fmt.Println(redisdb.HLen("hk1").Val())
	fmt.Println(redisdb.HExists("hk1", "f1").Val())
	fmt.Println(redisdb.HLen("hk1").Val())
}
func ExampleKey() {

	err := redisdb.Set("key", "value", 0).Err()
	if err != nil {
		panic(err)
	}

	val, err := redisdb.Get("key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("key", val)

	val2, err := redisdb.Get("key2").Result()
	if err == redis.Nil {
		fmt.Println("key2 does not exist")
	} else if err != nil {
		panic(err)
	} else {
		fmt.Println("key2", val2)
	}

	// 追加
	fmt.Println(redisdb.Append("key", "1").Val())
	// 获取key
	fmt.Println(redisdb.Get("key").Val())
	// 设置过期时间
	fmt.Println(redisdb.Expire("key", 30*time.Second).Val())
	// 是否存在
	fmt.Println(redisdb.Exists("key").Val())
	// 查看过期时间，如果key不存在返回-2 如果key已过期返回-1
	fmt.Println(redisdb.TTL("key").Val())
	// 取消过期时间  永久
	fmt.Println(redisdb.Persist("key"))
	// 查看类型
	fmt.Println(redisdb.Type("key").Val())
	// 如果key1已存在，会覆盖key1的值
	fmt.Println(redisdb.Rename("key", "key1").Val())
	// 只有当key1不存在，重命名才会成功
	// fmt.Println(redisdb.RenameNX("key", "key1").Val())

	// 将key移动到指定的数据库
	// fmt.Println(redisdb.Move("key1", 2).Result())

	// 仅当key1不存在才重新设置
	fmt.Println(redisdb.SetNX("key1", "new value", 30*time.Second).Val())
	fmt.Println(redisdb.Get("key1").Val())
	// 仅当key1存在才重新设置
	fmt.Println(redisdb.SetXX("key1", "new value", 30*time.Second).Val())
	fmt.Println(redisdb.Get("key1").Val())

	// 先获取key1里的值返回，在设置新的值
	fmt.Println(redisdb.GetSet("key1", "value1").Val())
	fmt.Println(redisdb.Get("key1").Val())

	// value 覆盖从 offset 偏移量开始
	fmt.Println(redisdb.SetRange("key1", 1, "112").Val())
	fmt.Println(redisdb.Get("key1").Val())

	// 长度
	fmt.Println(redisdb.StrLen("key1").Val())

	// 指定区间获取 左闭右开  [0,4)
	fmt.Println(redisdb.GetRange("key1", 0, 4).Val())

	// 备份  然后会保存到rdb文件  重新启动服务就会恢复数据
	// redisdb.Save()
	// 后台执行
	// redisdb.BgSave()
	// 停止掉服务
	// redisdb.ShutdownNoSave()

	// 批量嘛

	fmt.Println(redisdb.MSet("key2", "v2", "key3", 3).Val())
	fmt.Println(redisdb.Incr("key3"))
	fmt.Println(redisdb.IncrBy("key3", 10))
	fmt.Println(redisdb.Decr("key3"))
	fmt.Println(redisdb.MGet("key2", "key3").Val())

	// 当前数据库键值对的数量
	fmt.Println(redisdb.DBSize())

	// 清洗当前数据库
	redisdb.FlushDb()
	// 清洗全部数据库
	redisdb.FlushAll()

	// 获取最后一次保存的unix时间
	redisdb.LastSave()

}
